home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / cmds / ld / dist / patch2 / ld.diff3 < prev    next >
Encoding:
Text File  |  1990-10-26  |  61.9 KB  |  2,246 lines

  1. *** ld.original    Thu Oct 25 22:09:56 1990
  2. --- ld.current    Thu Oct 25 21:58:36 1990
  3. ***************
  4. *** 27,37 ****
  5. --- 27,170 ----
  6.   #include <fcntl.h>
  7.   #endif
  8.   
  9. + #define NO_C_PLUS_PLUS
  10. + #define TARGET_SUN2             2
  11. + #define TARGET_SUN3             3
  12. + #define TARGET_SUN4             4
  13. + #define TARGET_ALTOS            5
  14. + #define TARGET_I386             6   
  15. + #define TARGET_HPUX             7
  16. + #define TARGET_SONY_NEWS        8
  17. + #define TARGET_SEQUENT          9
  18. + #define TARGET_VAX              10
  19. + /*
  20. +  * If `TARGET_MACHINE' was not defined on the compiler command line,
  21. +  * then set it equal to the host machine.
  22. +  */
  23. + #ifndef TARGET_MACHINE
  24. + #if defined(sun) && defined(sparc)
  25. + #define TARGET_MACHINE  TARGET_SUN4
  26. + #endif
  27. + #if defined(sun) && (defined(m68020) || defined(mc68020))
  28. + #define TARGET_MACHINE  TARGET_SUN3
  29. + #endif
  30. + #if defined(sun) && (defined(m68010) || defined(mc68010))
  31. + #define TARGET_MACHINE  TARGET_SUN2
  32. + #endif
  33. + #if defined(ALTOS)
  34. + #define TARGET_MACHINE  TARGET_ALTOS
  35. + #endif
  36. + #if defined(hpux)
  37. + #define TARGET_MACHINE  TARGET_HPUX
  38. + #endif
  39. + #if defined(is386)
  40. + #define TARGET_MACHINE  TARGET_I386
  41. + #endif
  42. + #if defined(sony_news)
  43. + #define TARGET_MACHINE  TARGET_SONY_NEWS
  44. + #endif
  45. + #if defined(sequent)
  46. + #define TARGET_MACHINE  TARGET_SEQUENT
  47. + #endif
  48. + #if defined(is68k) && !defined(TARGET_MACHINE)
  49. + #define TARGET_MACHINE  TARGET_68K
  50. + #endif
  51. + #endif
  52. + #ifndef TARGET_MACHINE
  53. +     CANNOT COMPILE, NO TARGET MACHINE SPECIFIED
  54. + #endif
  55. + #ifndef BIG_ENDIAN
  56. + #define BIG_ENDIAN      4321
  57. + #endif
  58. + #ifndef LITTLE_ENDIAN
  59. + #define LITTLE_ENDIAN   1234
  60. + #endif
  61. + #ifndef PDP_ENDIAN
  62. + /* I think it is unlikely that anybody will try to cross compile
  63. +  * to or from a pdp, so only big-endian and little-endian are supported. */
  64. + #define PDP_ENDIAN   3412
  65. + #endif
  66. + #if TARGET_MACHINE==TARGET_SUN4         || \
  67. +     TARGET_MACHINE==TARGET_SUN3         || \
  68. +     TARGET_MACHINE==TARGET_SUN2         || \
  69. +     TARGET_MACHINE==TARGET_ALTOS        || \
  70. +     TARGET_MACHINE==TARGET_HPUX         || \
  71. +     TARGET_MACHINE==TARGET_SONY_NEWS    || \
  72. +     TARGET_MACHINE==TARGET_68K
  73. + #define TARGET_BYTE_ORDER       BIG_ENDIAN
  74. + #endif
  75. + #if TARGET_MACHINE==TARGET_VAX          || \
  76. +     TARGET_MACHINE==TARGET_I386         || \
  77. +     TARGET_MACHINE==TARGET_SEQUENT
  78. + #define TARGET_BYTE_ORDER       LITTLE_ENDIAN
  79. + #endif
  80. + #if TARGET_MACHINE==TARGET_SUN3
  81. + #define TARGET_PAGE_SIZE    0x2000
  82. + #endif
  83. + #if defined(sparc)      || \
  84. +     defined(m68000)     || \
  85. +     defined(mc68000)    || \
  86. +     defined(m68010)     || \
  87. +     defined(mc68010)    || \
  88. +     defined(m68020)     || \
  89. +     defined(mc68020)    || \
  90. +     defined(is68k)      || \
  91. +     defined(hpux)       || \
  92. +     defined(sony_news)
  93. + #define HOST_BYTE_ORDER     BIG_ENDIAN
  94. + #endif
  95. + #if defined(vax)        || \
  96. +     defined(is386)      || \
  97. +     defined(ds3100)     || \
  98. +     defined(sequent)
  99. + #define HOST_BYTE_ORDER     LITTLE_ENDIAN
  100. + #endif
  101. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  102. + static void fix_byte_order();
  103. + static void fix_exec_header_byte_order();
  104. + static void fix_symbol_byte_order();
  105. + static void target_to_host_reloc_byte_order();
  106. + static void host_to_target_reloc_byte_order();
  107. + static void fix_symbol_root_byte_order();
  108. + #endif
  109.   #ifdef COFF_ENCAPSULATE
  110.   #include "a.out.encap.h"
  111.   #else
  112. + #ifdef sprite
  113. + #if TARGET_MACHINE==TARGET_SUN4
  114. + #include <sun4.md/a.out.h>
  115. + #elif TARGET_MACHINE==TARGET_SUN3
  116. + #include <sun3.md/a.out.h>
  117. + #elif TARGET_MACHINE==TARGET_SEQUENT
  118. + #include <symm.md/a.out.h>
  119. + #else
  120. +     no a.out.h specified
  121. + #endif
  122. + #else
  123.   #include <a.out.h>
  124.   #endif
  125. + #endif
  126. + #ifdef sprite
  127. + #undef NEW_SEG_SIZE
  128. + #if TARGET_MACHINE==TARGET_SUN4
  129. + #define NEW_SEG_SIZE    0x40000
  130. + #endif
  131. + #if TARGET_MACHINE==TARGET_SUN3
  132. + #define NEW_SEG_SIZE    0x20000
  133. + #endif
  134. + #endif  /* sprite */
  135.   
  136.   #ifndef N_SET_MAGIC
  137.   #define N_SET_MAGIC(exec, val)  ((exec).a_magic = val)
  138. ***************
  139. *** 85,91 ****
  140.   
  141.   /* Define this to specify the default executable format.  */
  142.   
  143. ! #ifdef hpux
  144.   #define DEFAULT_MAGIC NMAGIC  /* hpux bugs screw ZMAGIC */
  145.   #endif
  146.   
  147. --- 218,224 ----
  148.   
  149.   /* Define this to specify the default executable format.  */
  150.   
  151. ! #if TARGET_MACHINE==TARGET_HPUX
  152.   #define DEFAULT_MAGIC NMAGIC  /* hpux bugs screw ZMAGIC */
  153.   #endif
  154.   
  155. ***************
  156. *** 96,125 ****
  157.   /* Ordinary 4.3bsd lacks these macros in a.out.h.  */
  158.   
  159.   #ifndef N_TXTADDR
  160. ! #if defined(vax) || defined(sony_news)
  161.   #define N_TXTADDR(X) 0
  162.   #endif
  163. ! #ifdef is68k
  164.   #define N_TXTADDR(x)  (sizeof (struct exec))
  165.   #endif
  166. ! #ifdef sequent
  167.   #define    N_TXTADDR(x) (N_ADDRADJ(x))
  168.   #endif
  169.   #endif
  170.   
  171.   #ifndef N_DATADDR
  172. ! #if defined(vax) || defined(sony_news)
  173.   #define N_DATADDR(x) \
  174.       (((x).a_magic==OMAGIC)? (N_TXTADDR(x)+(x).a_text) \
  175.       : (page_size+((N_TXTADDR(x)+(x).a_text-1) & ~(page_size-1))))
  176.   #endif
  177. ! #ifdef is68k
  178.   #define SEGMENT_SIZE 0x20000
  179.   #define N_DATADDR(x) \
  180. !     (((x).a_magic==Omagic)? (N_TXTADDR(x)+(x).a_text) \
  181.        : (SEGMENT_SIZE + ((N_TXTADDR(x)+(x).a_text-1) & ~(SEGMENT_SIZE-1))))
  182.   #endif
  183. ! #ifdef sequent
  184.   #define N_DATADDR(x) \
  185.       (((x).a_magic==OMAGIC)? (N_TXTADDR(x)+(x).a_text) \
  186.       : (page_size+(((x).a_text-1) & ~(page_size-1))))
  187. --- 229,258 ----
  188.   /* Ordinary 4.3bsd lacks these macros in a.out.h.  */
  189.   
  190.   #ifndef N_TXTADDR
  191. ! #if TARGET_MACHINE==TARGET_VAX || TARGET_MACHINE==TARGET_SONY_NEWS
  192.   #define N_TXTADDR(X) 0
  193.   #endif
  194. ! #if TARGET_MACHINE==TARGET_SUN3 || TARGET_MACHINE==TARGET_SUN2
  195.   #define N_TXTADDR(x)  (sizeof (struct exec))
  196.   #endif
  197. ! #if TARGET_MACHINE==TARGET_SEQUENT
  198.   #define    N_TXTADDR(x) (N_ADDRADJ(x))
  199.   #endif
  200.   #endif
  201.   
  202.   #ifndef N_DATADDR
  203. ! #if TARGET_MACHINE==TARGET_VAX || TARGET_MACHINE==TARGET_SONY_NEWS
  204.   #define N_DATADDR(x) \
  205.       (((x).a_magic==OMAGIC)? (N_TXTADDR(x)+(x).a_text) \
  206.       : (page_size+((N_TXTADDR(x)+(x).a_text-1) & ~(page_size-1))))
  207.   #endif
  208. ! #if TARGET_MACHINE==TARGET_SUN3 || TARGET_MACHINE==TARGET_SUN2
  209.   #define SEGMENT_SIZE 0x20000
  210.   #define N_DATADDR(x) \
  211. !     (((x).a_magic==OMAGIC)? (N_TXTADDR(x)+(x).a_text) \
  212.        : (SEGMENT_SIZE + ((N_TXTADDR(x)+(x).a_text-1) & ~(SEGMENT_SIZE-1))))
  213.   #endif
  214. ! #if TARGET_MACHINE==TARGET_SEQUENT
  215.   #define N_DATADDR(x) \
  216.       (((x).a_magic==OMAGIC)? (N_TXTADDR(x)+(x).a_text) \
  217.       : (page_size+(((x).a_text-1) & ~(page_size-1))))
  218. ***************
  219. *** 127,168 ****
  220.   #endif
  221.   
  222.   /* Define how to initialize system-dependent header fields.  */
  223. ! #ifdef sun
  224. ! #ifdef sparc
  225.   #define INITIALIZE_HEADER \
  226.     {outheader.a_machtype = M_SPARC; outheader.a_toolversion = 1;}
  227.   #endif
  228. ! #if defined(mc68010) || defined(m68010)
  229.   #define INITIALIZE_HEADER outheader.a_machtype = M_68010
  230.   #endif
  231. ! #ifndef INITIALIZE_HEADER
  232.   #define INITIALIZE_HEADER outheader.a_machtype = M_68020
  233.   #endif
  234. ! #endif
  235. ! #ifdef ALTOS
  236.   #define INITIALIZE_HEADER N_SET_MACHTYPE (outheader, M_68020)
  237.   #endif
  238. ! #ifdef is68k
  239. ! #ifdef M_68020
  240. ! /* ISI rel 4.0D doesn't use it, and rel 3.05 doesn't have an
  241. !    a_machtype field and so won't recognize the magic number.  To keep
  242. !    binary compatibility for now, just ignore it */
  243. ! #define INITIALIZE_HEADER outheader.a_machtype = 0;
  244. ! #endif
  245. ! #endif
  246. ! #ifdef hpux
  247.   #define INITIALIZE_HEADER N_SET_MACHTYPE (outheader, HP9000S200_ID)
  248.   #endif
  249. ! #if defined(i386) && !defined(sequent)
  250.   #define INITIALIZE_HEADER N_SET_MACHTYPE (outheader, M_386)
  251.   #endif
  252. ! #ifdef is68k
  253.   /* This enables code to take care of an ugly hack in the ISI OS.
  254.      If a symbol beings with _$, then the object file is included only
  255.      if the rest of the symbol name has been referenced. */
  256.   #define DOLLAR_KLUDGE
  257.   #endif
  258.   
  259.   /*
  260.    * Alloca include.
  261. --- 260,312 ----
  262.   #endif
  263.   
  264.   /* Define how to initialize system-dependent header fields.  */
  265. ! #if TARGET_MACHINE==TARGET_SUN4
  266.   #define INITIALIZE_HEADER \
  267.     {outheader.a_machtype = M_SPARC; outheader.a_toolversion = 1;}
  268.   #endif
  269. ! #if TARGET_MACHINE==TARGET_SUN2
  270.   #define INITIALIZE_HEADER outheader.a_machtype = M_68010
  271.   #endif
  272. ! #if TARGET_MACHINE==TARGET_SUN3
  273.   #define INITIALIZE_HEADER outheader.a_machtype = M_68020
  274.   #endif
  275. ! #if TARGET_MACHINE==TARGET_ALTOS
  276.   #define INITIALIZE_HEADER N_SET_MACHTYPE (outheader, M_68020)
  277.   #endif
  278. ! #if TARGET_MACHINE==TARGET_HPUX
  279.   #define INITIALIZE_HEADER N_SET_MACHTYPE (outheader, HP9000S200_ID)
  280.   #endif
  281. ! #if TARGET_MACHINE==TARGET_I386
  282.   #define INITIALIZE_HEADER N_SET_MACHTYPE (outheader, M_386)
  283.   #endif
  284. ! #if TARGET_MACHINE==TARGET_68K
  285. ! #define INITIALIZE_HEADER outheader.a_machtype = 0;  
  286.   /* This enables code to take care of an ugly hack in the ISI OS.
  287.      If a symbol beings with _$, then the object file is included only
  288.      if the rest of the symbol name has been referenced. */
  289.   #define DOLLAR_KLUDGE
  290.   #endif
  291. + #if TARGET==TARGET_SEQUENT
  292. + /* This is all stuff needed to make standalone binaries */
  293. + static struct gdtbl gdt_filler = {
  294. +     { 0x0000FFFF, 0x00CF9A00 },    /* code entry */
  295. +     { 0x0000FFFF, 0x00CF9200 },    /* data entry */
  296. +     { 0x00180017, 0x00000000 },    /* 6 byte descriptor */
  297. + };
  298. + static char instr[] = {
  299. +     0x67, 0x66, 0x0f, 0x01, 0x15, 0x30, 0x00, 0x00, 0x00,
  300. +     0x0f, 0x20, 0xc3,
  301. +     0x80, 0xcb, 0x01,
  302. +     0x0f, 0x22, 0xc3,
  303. +     0xea, 0x5b, 0x00, 0x08, 0x00,
  304. +     0xbb, 0x10, 0x00, 0x00, 0x00,
  305. +     0x8e, 0xdb,
  306. +     0x8e, 0xd3,
  307. +     0x8e, 0xc3,
  308. +     0xff, 0x25, 0x6c, 0x00, 0x00, 0x00,
  309. +     0x00, 0x00, 0x00, 0x00, };
  310. + #endif   
  311.   
  312.   /*
  313.    * Alloca include.
  314. ***************
  315. *** 253,259 ****
  316.    *
  317.    */
  318.   
  319. ! #if defined(sun) && defined(sparc)
  320.   /* Sparc (Sun 4) macros */
  321.   #undef relocation_info
  322.   #define relocation_info                    reloc_info_sparc
  323. --- 397,403 ----
  324.    *
  325.    */
  326.   
  327. ! #if TARGET_MACHINE==TARGET_SUN4
  328.   /* Sparc (Sun 4) macros */
  329.   #undef relocation_info
  330.   #define relocation_info                    reloc_info_sparc
  331. ***************
  332. *** 264,275 ****
  333.   #define RELOC_MEMORY_SUB_P(r)        0
  334.   #define RELOC_MEMORY_ADD_P(r)           0
  335.   #define RELOC_ADD_EXTRA(r)              ((r)->r_addend)       
  336. ! #define RELOC_PCREL_P(r)             \
  337. !         ((r)->r_type >= RELOC_DISP8 && (r)->r_type <= RELOC_WDISP22)
  338. ! #define RELOC_VALUE_RIGHTSHIFT(r)       (reloc_target_rightshift[(r)->r_type])
  339. ! #define RELOC_TARGET_SIZE(r)            (reloc_target_size[(r)->r_type])
  340.   #define RELOC_TARGET_BITPOS(r)          0
  341. ! #define RELOC_TARGET_BITSIZE(r)         (reloc_target_bitsize[(r)->r_type])
  342.   
  343.   /* Note that these are very dependent on the order of the enums in
  344.      enum reloc_type (in a.out.h); if they change the following must be
  345. --- 408,422 ----
  346.   #define RELOC_MEMORY_SUB_P(r)        0
  347.   #define RELOC_MEMORY_ADD_P(r)           0
  348.   #define RELOC_ADD_EXTRA(r)              ((r)->r_addend)       
  349. ! #define RELOC_PCREL_P(r)                \
  350. !     ((int) (r)->r_type >= (int) RELOC_DISP8 && \
  351. !      (int) (r)->r_type <= (int) RELOC_WDISP22)
  352. ! #define RELOC_VALUE_RIGHTSHIFT(r) \
  353. !     (reloc_target_rightshift[(int) (r)->r_type])
  354. ! #define RELOC_TARGET_SIZE(r)            (reloc_target_size[(int) (r)->r_type])
  355.   #define RELOC_TARGET_BITPOS(r)          0
  356. ! #define RELOC_TARGET_BITSIZE(r) \
  357. !     (reloc_target_bitsize[(int) (r)->r_type])
  358.   
  359.   /* Note that these are very dependent on the order of the enums in
  360.      enum reloc_type (in a.out.h); if they change the following must be
  361. ***************
  362. *** 286,294 ****
  363.   };
  364.   
  365.   #define    MAX_ALIGNMENT    (sizeof (double))
  366.   #endif
  367.   
  368. ! #ifdef sequent
  369.   #define RELOC_ADDRESS(r)        ((r)->r_address)
  370.   #define RELOC_EXTERN_P(r)        ((r)->r_extern)
  371.   #define RELOC_TYPE(r)        ((r)->r_symbolnum)
  372. --- 433,445 ----
  373.   };
  374.   
  375.   #define    MAX_ALIGNMENT    (sizeof (double))
  376. +   /* The pagesize on an old sun4 is 0x2000, on sparcStation it is 0x1000.
  377. +      If you want to use the same binaries on both, then you need to use
  378. +      the larger pagesize. */
  379. + #define TARGET_PAGE_SIZE    0x2000
  380.   #endif
  381.   
  382. ! #if TARGET_MACHINE==TARGET_SEQUENT
  383.   #define RELOC_ADDRESS(r)        ((r)->r_address)
  384.   #define RELOC_EXTERN_P(r)        ((r)->r_extern)
  385.   #define RELOC_TYPE(r)        ((r)->r_symbolnum)
  386. ***************
  387. *** 301,306 ****
  388. --- 452,458 ----
  389.   #define RELOC_TARGET_SIZE(r)        ((r)->r_length)
  390.   #define RELOC_TARGET_BITPOS(r)    0
  391.   #define RELOC_TARGET_BITSIZE(r)    32
  392. + #define TARGET_PAGE_SIZE    0x1000
  393.   #endif
  394.   
  395.   /* Default macros */
  396. ***************
  397. *** 530,535 ****
  398. --- 682,696 ----
  399.       }
  400.     symbol;
  401.   
  402. + #ifndef NO_C_PLUS_PLUS
  403. + /* Demangler for C++. */
  404. + extern char *cplus_demangle ();
  405. + #endif /* NO_C_PLUS_PLUS */
  406. + /* Demangler function to use. */
  407. + char *(*demangler)() = NULL;
  408.   /* Number of buckets in symbol hash table */
  409.   #define    TABSIZE    1009
  410.   
  411. ***************
  412. *** 804,809 ****
  413. --- 965,976 ----
  414.      and reduce the size of the bss section to match.  */
  415.   int specified_data_size;
  416.   
  417. + /* Gap to insert between end of bss and start of data seg */
  418. + int data_gap;
  419. + /* Nonzero if -Z was specified (for data_gap) */
  420. + int Z_flag_specified;
  421.   /* Magic number to use for the output file, set by switch.  */
  422.   int magic;
  423.   
  424. ***************
  425. *** 896,912 ****
  426.   char *concat ();
  427.   char *get_file_name ();
  428.   symbol *getsym (), *getsym_soft ();
  429.   int
  430.   main (argc, argv)
  431.        char **argv;
  432.        int argc;
  433.   {
  434.     page_size = getpagesize ();
  435.     progname = argv[0];
  436.   
  437.     /* Clear the cumulative info on the output file.  */
  438.     text_size = 0;
  439.     data_size = 0;
  440.     bss_size = 0;
  441. --- 1063,1096 ----
  442.   char *concat ();
  443.   char *get_file_name ();
  444.   symbol *getsym (), *getsym_soft ();
  445.   int
  446.   main (argc, argv)
  447.        char **argv;
  448.        int argc;
  449.   {
  450. + /*   Added this to stop ld core-dumping on very large .o files.    */
  451. + #ifdef RLIMIT_STACK
  452. +   /* Get rid of any avoidable limit on stack size.  */
  453. +   {
  454. +       struct rlimit rlim;
  455. +       /* Set the stack limit huge so that alloca does not fail. */
  456. +       getrlimit (RLIMIT_STACK, &rlim);
  457. +       rlim.rlim_cur = rlim.rlim_max;
  458. +       setrlimit (RLIMIT_STACK, &rlim);
  459. +   }
  460. + #endif /* RLIMIT_STACK */
  461. + #ifdef TARGET_PAGE_SIZE
  462. +   page_size = TARGET_PAGE_SIZE;
  463. + #else
  464.     page_size = getpagesize ();
  465. + #endif
  466.     progname = argv[0];
  467.   
  468.     /* Clear the cumulative info on the output file.  */
  469.     text_size = 0;
  470.     data_size = 0;
  471.     bss_size = 0;
  472. ***************
  473. *** 932,937 ****
  474. --- 1116,1122 ----
  475.     make_executable = 1;
  476.     force_executable = 0;
  477.     set_element_prefixes = 0;
  478. +   Z_flag_specified = 0;
  479.   
  480.     /* Initialize the cumulative counts of symbols.  */
  481.   
  482. ***************
  483. *** 948,955 ****
  484.   
  485.     /* Keep a list of symbols referenced from the command line */
  486.     cl_refs_allocated = 10;
  487. !   cmdline_references
  488. !     = (struct glosym **) xmalloc (cl_refs_allocated
  489.                     * sizeof(struct glosym *));
  490.     *cmdline_references = 0;
  491.   
  492. --- 1133,1140 ----
  493.   
  494.     /* Keep a list of symbols referenced from the command line */
  495.     cl_refs_allocated = 10;
  496. !   cmdline_references =
  497. !     (struct glosym **) xmalloc (cl_refs_allocated
  498.                     * sizeof(struct glosym *));
  499.     *cmdline_references = 0;
  500.   
  501. ***************
  502. *** 984,989 ****
  503. --- 1169,1177 ----
  504.   
  505.     text_size -= N_TXTOFF (outheader);
  506.   
  507. +   if (T_flag_specified)
  508. +       text_size = 0;    /* don't add sizeof(exec) at -T location */
  509.     if (text_size < 0)
  510.       text_size = 0;
  511.     entry_offset = text_size;
  512. ***************
  513. *** 1046,1051 ****
  514. --- 1234,1240 ----
  515.       case 'u':
  516.       case 'V':
  517.       case 'y':
  518. +     case 'Z':
  519.         if (arg[2])
  520.       return 1;
  521.         return 2;
  522. ***************
  523. *** 1062,1067 ****
  524. --- 1251,1265 ----
  525.         if (! strcmp (&arg[2], "data"))
  526.       return 2;
  527.         return 1;
  528. + #if TARGET==TARGET_SEQUENT      
  529. +       /* k == Symmetry standalone,
  530. +        * p == don't align text/data boundary (for 8K disk bootstraps).
  531. +        */
  532. +    case 'k':
  533. +    case 'p':
  534. +        return 1;
  535. + #endif       
  536.       }
  537.   
  538.     return 1;
  539. ***************
  540. *** 1158,1170 ****
  541.   
  542.     /* Now check some option settings for consistency.  */
  543.   
  544.   #ifdef NMAGIC
  545.     if ((magic == ZMAGIC || magic == NMAGIC)
  546.   #else
  547. !   if ((magic == ZMAGIC)
  548.   #endif
  549.         && (text_start - text_start_alignment) & (page_size - 1))
  550.       fatal ("-T argument not multiple of page size, with sharable output", 0);
  551.   
  552.     /* Append the standard search directories to the user-specified ones.  */
  553.     {
  554. --- 1356,1374 ----
  555.   
  556.     /* Now check some option settings for consistency.  */
  557.   
  558. + #ifndef sprite
  559.   #ifdef NMAGIC
  560.     if ((magic == ZMAGIC || magic == NMAGIC)
  561.   #else
  562. ! #ifdef SMAGIC
  563. !     if ((magic == SMAGIC || magic == ZMAGIC)
  564. ! #else
  565. !     if ((magic == ZMAGIC)
  566. ! #endif /* SMAGIC */
  567.   #endif
  568.         && (text_start - text_start_alignment) & (page_size - 1))
  569.       fatal ("-T argument not multiple of page size, with sharable output", 0);
  570. + #endif
  571.   
  572.     /* Append the standard search directories to the user-specified ones.  */
  573.     {
  574. ***************
  575. *** 1240,1245 ****
  576. --- 1444,1452 ----
  577.       return;
  578.     if (! strcmp (swt + 1, "Ttext"))
  579.       {
  580. + #ifdef sprite 
  581. +       magic = OMAGIC;
  582. + #endif
  583.         text_start = parse (arg, "%x", "invalid argument to -Ttext");
  584.         T_flag_specified = 1;
  585.         return;
  586. ***************
  587. *** 1280,1286 ****
  588. --- 1487,1508 ----
  589.         add_cmdline_ref (entry_symbol);
  590.         return;
  591.   
  592. + #if TARGET==TARGET_SEQUENT
  593. +     case 'k':
  594. + #ifdef SMAGIC
  595. +       magic = SMAGIC;
  596. + #else
  597. +       fatal("No SMAGIC defined for -k");
  598. + #endif
  599. +       return;
  600. + #endif
  601.       case 'l':
  602. + #ifndef NO_C_PLUS_PLUS
  603. +       /* If linking with libg++, use the C++ demangler. */
  604. +       if (arg != NULL && strcmp (arg, "g++") == 0)
  605. +       demangler = cplus_demangle;
  606. + #endif /* NO_C_PLUS_PLUS */
  607.         return;
  608.   
  609.       case 'L':
  610. ***************
  611. *** 1323,1328 ****
  612. --- 1545,1553 ----
  613.         return;
  614.   
  615.       case 'T':
  616. + #ifdef sprite
  617. +       magic = OMAGIC;
  618. + #endif      
  619.         text_start = parse (arg, "%x", "invalid argument to -T");
  620.         T_flag_specified = 1;
  621.         return;
  622. ***************
  623. *** 1372,1377 ****
  624. --- 1597,1609 ----
  625.         magic = ZMAGIC;
  626.         return;
  627.   
  628. +     case 'Z':
  629. +       data_gap = parse (arg, "%x", "invalid argument to -Z");
  630. +       if (data_gap % page_size)
  631. +       fatal("-Z argument not a multiple of page size", 0);
  632. +       Z_flag_specified = 1;
  633. +       return;
  634.       default:
  635.         fatal ("invalid command option `%s'", swt);
  636.       }
  637. ***************
  638. *** 1415,1421 ****
  639.   
  640.      FUNCTION receives two arguments: the entry, and ARG.  It must be a
  641.      function returning unsigned long (though this can probably be fudged). */
  642.   unsigned long
  643.   check_each_file (function, arg)
  644.        register unsigned long (*function)();
  645. --- 1647,1653 ----
  646.   
  647.      FUNCTION receives two arguments: the entry, and ARG.  It must be a
  648.      function returning unsigned long (though this can probably be fudged). */
  649. ! #if 0
  650.   unsigned long
  651.   check_each_file (function, arg)
  652.        register unsigned long (*function)();
  653. ***************
  654. *** 1440,1445 ****
  655. --- 1672,1678 ----
  656.       }
  657.     return 0;
  658.   }
  659. + #endif
  660.   
  661.   /* Like `each_file' but ignore files that were just for symbol definitions.  */
  662.   
  663. ***************
  664. *** 1496,1502 ****
  665.   
  666.     if (entry->search_dirs_flag)
  667.       {
  668. -       register char **p = search_dirs;
  669.         int i;
  670.   
  671.         for (i = 0; i < n_search_dirs; i++)
  672. --- 1729,1734 ----
  673. ***************
  674. *** 1596,1601 ****
  675. --- 1828,1836 ----
  676.     len = read (desc, loc, sizeof (struct exec));
  677.     if (len != sizeof (struct exec))
  678.       fatal_with_file ("failure reading header of ", entry);
  679. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  680. +   fix_exec_header_byte_order(loc);
  681. + #endif
  682.     if (N_BADMAG (*loc))
  683.       fatal_with_file ("bad magic number in ", entry);
  684.   
  685. ***************
  686. *** 1622,1632 ****
  687.     lseek (desc, N_SYMOFF (entry->header) + entry->starting_offset, 0);
  688.     if (entry->header.a_syms != read (desc, entry->symbols, entry->header.a_syms))
  689.       fatal_with_file ("premature end of file in symbols of ", entry);
  690.     lseek (desc, N_STROFF (entry->header) + entry->starting_offset, 0);
  691.     if (sizeof str_size != read (desc, &str_size, sizeof str_size))
  692.       fatal_with_file ("bad string table size in ", entry);
  693.     entry->string_size = str_size;
  694.   }
  695.   
  696. --- 1857,1871 ----
  697.     lseek (desc, N_SYMOFF (entry->header) + entry->starting_offset, 0);
  698.     if (entry->header.a_syms != read (desc, entry->symbols, entry->header.a_syms))
  699.       fatal_with_file ("premature end of file in symbols of ", entry);
  700. ! #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  701. !   fix_symbol_byte_order(entry->symbols, entry->header.a_syms);
  702. ! #endif
  703.     lseek (desc, N_STROFF (entry->header) + entry->starting_offset, 0);
  704.     if (sizeof str_size != read (desc, &str_size, sizeof str_size))
  705.       fatal_with_file ("bad string table size in ", entry);
  706. ! #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  707. !   fix_byte_order(&str_size, sizeof(str_size));
  708. ! #endif
  709.     entry->string_size = str_size;
  710.   }
  711.   
  712. ***************
  713. *** 1706,1712 ****
  714.     len = read (desc, &hdr, sizeof hdr);
  715.     if (len != sizeof hdr)
  716.       fatal_with_file ("failure reading header of ", entry);
  717.     if (!N_BADMAG (hdr))
  718.       {
  719.         read_entry_symbols (desc, entry);
  720. --- 1945,1953 ----
  721.     len = read (desc, &hdr, sizeof hdr);
  722.     if (len != sizeof hdr)
  723.       fatal_with_file ("failure reading header of ", entry);
  724. ! #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  725. !   fix_exec_header_byte_order(&hdr);
  726. ! #endif
  727.     if (!N_BADMAG (hdr))
  728.       {
  729.         read_entry_symbols (desc, entry);
  730. ***************
  731. *** 1738,1744 ****
  732.     register struct nlist
  733.       *p,
  734.       *end = entry->symbols + entry->header.a_syms / sizeof (struct nlist);
  735. -   int lowest_set_vector = -1;
  736.   
  737.     if (trace_files) prline_file_name (entry, stderr);
  738.   
  739. --- 1979,1984 ----
  740. ***************
  741. *** 1748,1754 ****
  742.         if (set_element_prefixes
  743.         && set_element_prefixed_p (p->n_un.n_strx + entry->strings))
  744.       p->n_type += (N_SETA - N_ABS);
  745.         if (SET_ELEMENT_P (p->n_type))
  746.       {
  747.         set_symbol_count++;
  748. --- 1988,1993 ----
  749. ***************
  750. *** 1808,1814 ****
  751.      all such structs that refer to the same global symbol.
  752.      This chain starts in the `refs' field of the symbol table entry
  753.      and is chained through the `n_name'.  */
  754.   void
  755.   enter_global_ref (nlist_p, name, entry)
  756.        register struct nlist *nlist_p;
  757. --- 2047,2052 ----
  758. ***************
  759. *** 1861,1868 ****
  760.       {
  761.         /* Indirect symbols value should be modified to point
  762.            a symbol being equivalenced to. */
  763. !       nlist_p->n_value
  764. !         = (unsigned int) getsym ((nlist_p + 1)->n_un.n_strx
  765.                        + entry->strings);
  766.         if ((symbol *) nlist_p->n_value == sp)
  767.           {
  768. --- 2099,2106 ----
  769.       {
  770.         /* Indirect symbols value should be modified to point
  771.            a symbol being equivalenced to. */
  772. !       nlist_p->n_value =
  773. !         (unsigned int) getsym ((nlist_p + 1)->n_un.n_strx
  774.                        + entry->strings);
  775.         if ((symbol *) nlist_p->n_value == sp)
  776.           {
  777. ***************
  778. *** 1961,1967 ****
  779.              (nlist_p + 1)->n_un.n_strx + entry->strings);
  780.         break;
  781.   
  782. ! #ifdef sequent
  783.       case N_SHUNDF:
  784.         reftype = "shared undf";
  785.         break;
  786. --- 2199,2205 ----
  787.              (nlist_p + 1)->n_un.n_strx + entry->strings);
  788.         break;
  789.   
  790. ! #if TARGET_MACHINE==TARGET_SEQUENT
  791.       case N_SHUNDF:
  792.         reftype = "shared undf";
  793.         break;
  794. ***************
  795. *** 1991,1996 ****
  796. --- 2229,2235 ----
  797.      contain the nlist point entry, and it returns the files entry
  798.      pointer (cast to unsigned long) if it does. */
  799.   
  800. + #if 0
  801.   unsigned long
  802.   contains_symbol (entry, n_ptr)
  803.        struct file_entry *entry;
  804. ***************
  805. *** 2002,2007 ****
  806. --- 2241,2247 ----
  807.       return (unsigned long) entry;
  808.     return 0;
  809.   }
  810. + #endif
  811.   
  812.   
  813.   /* Searching libraries */
  814. ***************
  815. *** 2130,2136 ****
  816.     bytes_read = read (desc, symdef_data, member_length);
  817.     if (bytes_read != member_length)
  818.       fatal_with_file ("malformatted __.SYMDEF in ", entry);
  819.     number_of_symdefs = *symdef_data / sizeof (struct symdef);
  820.     if (number_of_symdefs < 0 ||
  821.          number_of_symdefs * sizeof (struct symdef) + 2 * sizeof (int) > member_length)
  822. --- 2370,2378 ----
  823.     bytes_read = read (desc, symdef_data, member_length);
  824.     if (bytes_read != member_length)
  825.       fatal_with_file ("malformatted __.SYMDEF in ", entry);
  826. ! #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  827. !   fix_byte_order(symdef_data, sizeof(*symdef_data));
  828. ! #endif
  829.     number_of_symdefs = *symdef_data / sizeof (struct symdef);
  830.     if (number_of_symdefs < 0 ||
  831.          number_of_symdefs * sizeof (struct symdef) + 2 * sizeof (int) > member_length)
  832. ***************
  833. *** 2137,2142 ****
  834. --- 2379,2392 ----
  835.       fatal_with_file ("malformatted __.SYMDEF in ", entry);
  836.   
  837.     symdef_base = (struct symdef *) (symdef_data + 1);
  838. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  839. +   for (i = 0; i < number_of_symdefs; ++i)
  840. +     {
  841. +       fix_byte_order(&symdef_base[i].symbol_name_string_index, sizeof(int));
  842. +       fix_byte_order(&symdef_base[i].library_member_offset, sizeof(int));
  843. +     }
  844. +   fix_byte_order(symdef_base + number_of_symdefs, sizeof(int));
  845. + #endif
  846.     length_of_strings = *(int *) (symdef_base + number_of_symdefs);
  847.   
  848.     if (length_of_strings < 0
  849. ***************
  850. *** 2182,2188 ****
  851.              about the archive member that the symbol is in.  */
  852.   
  853.           if (sp && ((sp->referenced && !sp->defined)
  854. !                || (sp->defined && sp->max_common_size)))
  855.             {
  856.           int junk;
  857.           register int j;
  858. --- 2432,2441 ----
  859.              about the archive member that the symbol is in.  */
  860.   
  861.           if (sp && ((sp->referenced && !sp->defined)
  862. ! #if 1        
  863. !                || (sp->defined && sp->max_common_size))
  864. ! #endif
  865. !                )
  866.             {
  867.           int junk;
  868.           register int j;
  869. ***************
  870. *** 2312,2318 ****
  871.   /* ENTRY is an entry for a library member.
  872.      Its symbols have been read into core, but not entered.
  873.      Return nonzero if we ought to load this member.  */
  874.   int
  875.   subfile_wanted_p (entry)
  876.        struct file_entry *entry;
  877. --- 2565,2570 ----
  878. ***************
  879. *** 2333,2339 ****
  880.        potentially want it.  */
  881.         if (type & N_EXT
  882.         && (type != (N_UNDF | N_EXT) || p->n_value
  883. !           
  884.   #ifdef DOLLAR_KLUDGE
  885.              || name[1] == '$'
  886.   #endif
  887. --- 2585,2591 ----
  888.        potentially want it.  */
  889.         if (type & N_EXT
  890.         && (type != (N_UNDF | N_EXT) || p->n_value
  891.   #ifdef DOLLAR_KLUDGE
  892.              || name[1] == '$'
  893.   #endif
  894. ***************
  895. *** 2378,2389 ****
  896.           {
  897.             /* Symbol being defined as common.
  898.                Remember this, but don't load subfile just for this.  */
  899.             /* If it didn't used to be common, up the count of
  900.                common symbols.  */
  901.             if (!sp->max_common_size)
  902.               common_defined_global_count++;
  903.             if (sp->max_common_size < p->n_value)
  904.               sp->max_common_size = p->n_value;
  905.             if (!sp->defined)
  906. --- 2630,2639 ----
  907. ***************
  908. *** 2392,2397 ****
  909. --- 2642,2674 ----
  910.             continue;
  911.           }
  912.   
  913. + #if TARGET==TARGET_SEQUENT
  914. +         /* Don't resolve common (data) symbols with text symbols*/
  915. +           if (type == (N_EXT | N_TEXT)) {
  916. +         int dontresolve = 0;
  917. +         struct nlist *p, *next;
  918. +         for (p = sp->refs; p; p = next) {
  919. +           if (p->n_value && (p->n_type == (N_UNDF | N_EXT))) {
  920. +               if (trace_files)
  921. +                   fprintf(stdout,
  922. +                       "refs check fail: symbol %s, ref type= 0x%x, ref value= 0x%x, sym type = 0x%x\n",
  923. +                       sp->name, p->n_type, p->n_value, type);
  924. +             dontresolve = 1;
  925. +             break;
  926. +           }
  927. +           next = (struct nlist *) p->n_un.n_name;
  928. +         }
  929. +         if (sp->trace) {
  930. +           fprintf(stdout, 
  931. +             "symbol %s can't use text sym def in file ", sp->name);
  932. +           print_file_name(entry, stdout);
  933. +           fprintf(stdout, "\n");
  934. +         }
  935. +         if (dontresolve)
  936. +           continue;
  937. +           }
  938. + #endif        
  939.             if (write_map)
  940.           {
  941.             print_file_name (entry, stdout);
  942. ***************
  943. *** 2418,2424 ****
  944.   digest_symbols ()
  945.   {
  946.     register int i;
  947. !   int setv_fill_count;
  948.   
  949.     if (trace_files)
  950.       fprintf (stderr, "Digesting symbol information:\n\n");
  951. --- 2695,2701 ----
  952.   digest_symbols ()
  953.   {
  954.     register int i;
  955. !   int setv_fill_count = 0;
  956.   
  957.     if (trace_files)
  958.       fprintf (stderr, "Digesting symbol information:\n\n");
  959. ***************
  960. *** 2432,2440 ****
  961.   
  962.   #ifdef NMAGIC
  963.     if (magic == ZMAGIC || magic == NMAGIC)
  964. ! #else
  965.     if (magic == ZMAGIC)
  966. ! #endif
  967.       {
  968.         int text_end = text_size + N_TXTOFF (outheader);
  969.         text_pad = ((text_end + page_size - 1) & (- page_size)) - text_end;
  970. --- 2709,2721 ----
  971.   
  972.   #ifdef NMAGIC
  973.     if (magic == ZMAGIC || magic == NMAGIC)
  974. ! #else /* NMAGIC */
  975. ! #ifdef SMAGIC
  976. !   if (magic == ZMAGIC || magic == SMAGIC)
  977. ! #else /* SMAGIC */
  978.     if (magic == ZMAGIC)
  979. ! #endif /* SMAGIC */
  980. ! #endif /* NMAGIC */
  981.       {
  982.         int text_end = text_size + N_TXTOFF (outheader);
  983.         text_pad = ((text_end + page_size - 1) & (- page_size)) - text_end;
  984. ***************
  985. *** 2442,2448 ****
  986.       }
  987.   
  988.     outheader.a_text = text_size;
  989. ! #ifdef sequent
  990.     outheader.a_text += N_ADDRADJ (outheader);
  991.   #endif
  992.   
  993. --- 2723,2729 ----
  994.       }
  995.   
  996.     outheader.a_text = text_size;
  997. ! #if TARGET_MACHINE==TARGET_SEQUENT
  998.     outheader.a_text += N_ADDRADJ (outheader);
  999.   #endif
  1000.   
  1001. ***************
  1002. *** 2450,2459 ****
  1003.   
  1004.     if (! Tdata_flag_specified)
  1005.       data_start = N_DATADDR (outheader) + text_start - N_TXTADDR (outheader);
  1006.     /* Make sure bss starts out aligned as much as anyone can want.  */
  1007.   
  1008.     data_size = (data_size + sizeof(double) - 1) & ~(sizeof(double)-1);
  1009.   
  1010.     /* Set up the set element vector */
  1011.   
  1012. --- 2731,2744 ----
  1013.   
  1014.     if (! Tdata_flag_specified)
  1015.       data_start = N_DATADDR (outheader) + text_start - N_TXTADDR (outheader);
  1016. ! #ifdef foobar
  1017.     /* Make sure bss starts out aligned as much as anyone can want.  */
  1018.   
  1019.     data_size = (data_size + sizeof(double) - 1) & ~(sizeof(double)-1);
  1020. + #endif
  1021. +   if (Z_flag_specified)
  1022. +       data_start += data_gap;
  1023.   
  1024.     /* Set up the set element vector */
  1025.   
  1026. ***************
  1027. *** 2463,2474 ****
  1028.            for each symbol for the length word at the beginning of the
  1029.        vector, plus a word for each symbol for a zero at the end of
  1030.        the vector (for incremental linking).  */
  1031. !       set_sect_size
  1032. !     = (2 * set_symbol_count + set_vector_count) * sizeof (unsigned long);
  1033.         set_sect_start = data_start + data_size;
  1034.         data_size += set_sect_size;
  1035.         set_vectors = (unsigned long *) xmalloc (set_sect_size);
  1036.         setv_fill_count = 0;
  1037.       }
  1038.   
  1039.     /* Compute start addresses of each file's sections and symbols.  */
  1040. --- 2748,2761 ----
  1041.            for each symbol for the length word at the beginning of the
  1042.        vector, plus a word for each symbol for a zero at the end of
  1043.        the vector (for incremental linking).  */
  1044. !       set_sect_size =
  1045. !         (2 * set_symbol_count + set_vector_count) * sizeof (unsigned long);
  1046.         set_sect_start = data_start + data_size;
  1047.         data_size += set_sect_size;
  1048.         set_vectors = (unsigned long *) xmalloc (set_sect_size);
  1049. + #if 1
  1050.         setv_fill_count = 0;
  1051. + #endif      
  1052.       }
  1053.   
  1054.     /* Compute start addresses of each file's sections and symbols.  */
  1055. ***************
  1056. *** 2493,2499 ****
  1057.       {
  1058.         /* For each symbol */
  1059.         register struct nlist *p, *next;
  1060. !       int defs = 0, com = sp->max_common_size, erred = 0;
  1061.         struct nlist *first_definition;
  1062.         for (p = sp->refs; p; p = next)
  1063.           {
  1064. --- 2780,2786 ----
  1065.       {
  1066.         /* For each symbol */
  1067.         register struct nlist *p, *next;
  1068. !       int defs = 0, com = sp->max_common_size;
  1069.         struct nlist *first_definition;
  1070.         for (p = sp->refs; p; p = next)
  1071.           {
  1072. ***************
  1073. *** 2575,2587 ****
  1074.            Reverse the vector itself to put it in file order.  */
  1075.         if ((sp->defined & ~N_EXT) == N_SETV)
  1076.           {
  1077. !           unsigned long length_word_index
  1078. !         = (sp->value - set_sect_start) / sizeof (unsigned long);
  1079.             unsigned long i, tmp;
  1080.   
  1081. !           set_vectors[length_word_index]
  1082. !         = setv_fill_count - 1 - length_word_index;
  1083.             /* Reverse the vector.  */
  1084.             for (i = 1;
  1085.              i < (setv_fill_count - length_word_index - 1) / 2 + 1;
  1086. --- 2862,2873 ----
  1087.            Reverse the vector itself to put it in file order.  */
  1088.         if ((sp->defined & ~N_EXT) == N_SETV)
  1089.           {
  1090. !           unsigned long length_word_index =
  1091. !             (sp->value - set_sect_start) / sizeof (unsigned long);
  1092.             unsigned long i, tmp;
  1093.   
  1094. !           set_vectors[length_word_index] =
  1095. !             setv_fill_count - 1 - length_word_index;
  1096.             /* Reverse the vector.  */
  1097.             for (i = 1;
  1098.              i < (setv_fill_count - length_word_index - 1) / 2 + 1;
  1099. ***************
  1100. *** 2588,2595 ****
  1101.              i++)
  1102.           {
  1103.             tmp = set_vectors[length_word_index + i];
  1104. !           set_vectors[length_word_index + i]
  1105. !             = set_vectors[setv_fill_count - i];
  1106.             set_vectors[setv_fill_count - i] = tmp;
  1107.           }
  1108.   
  1109. --- 2874,2881 ----
  1110.              i++)
  1111.           {
  1112.             tmp = set_vectors[length_word_index + i];
  1113. !           set_vectors[length_word_index + i] =
  1114. !             set_vectors[setv_fill_count - i];
  1115.             set_vectors[setv_fill_count - i] = tmp;
  1116.           }
  1117.   
  1118. ***************
  1119. *** 2600,2608 ****
  1120. --- 2886,2896 ----
  1121.       }
  1122.       }
  1123.   
  1124. + #ifdef foobar
  1125.     /* Make sure end of bss is aligned as much as anyone can want.  */
  1126.   
  1127.     bss_size = (bss_size + sizeof(double) - 1) & ~(sizeof(double)-1);
  1128. + #endif
  1129.   
  1130.     if (end_symbol)        /* These are null if -r.  */
  1131.       {
  1132. ***************
  1133. *** 2616,2624 ****
  1134.     if (specified_data_size && specified_data_size > data_size)
  1135.       data_pad = specified_data_size - data_size;
  1136.   
  1137.     if (magic == ZMAGIC)
  1138.       data_pad = ((data_pad + data_size + page_size - 1) & (- page_size))
  1139. !                - data_size;
  1140.   
  1141.     bss_size -= data_pad;
  1142.     if (bss_size < 0) bss_size = 0;
  1143. --- 2904,2916 ----
  1144.     if (specified_data_size && specified_data_size > data_size)
  1145.       data_pad = specified_data_size - data_size;
  1146.   
  1147. + #ifdef SMAGIC
  1148. +   if (magic == SMAGIC || magic == ZMAGIC)
  1149. + #else
  1150.     if (magic == ZMAGIC)
  1151. + #endif
  1152.       data_pad = ((data_pad + data_size + page_size - 1) & (- page_size))
  1153. !     - data_size;
  1154.   
  1155.     bss_size -= data_pad;
  1156.     if (bss_size < 0) bss_size = 0;
  1157. ***************
  1158. *** 2788,2794 ****
  1159.   {
  1160.     int line;
  1161.     char *filename;
  1162. !   struct nlist *sym;
  1163.   };
  1164.   
  1165.   void qsort ();
  1166. --- 3080,3086 ----
  1167.   {
  1168.     int line;
  1169.     char *filename;
  1170. !   struct nlist *Sym;
  1171.   };
  1172.   
  1173.   void qsort ();
  1174. ***************
  1175. *** 2824,2850 ****
  1176.       *next = state_pointer + 1,
  1177.       /* Used to store source file */
  1178.       *source = state_pointer + 2;
  1179. !   struct file_entry *entry = (struct file_entry *) source->sym;
  1180.   
  1181. !   current->sym = next->sym;
  1182.     current->line = next->line;
  1183.     current->filename = next->filename;
  1184.   
  1185. !   while (++(next->sym) < (entry->symbols
  1186.                 + entry->header.a_syms/sizeof (struct nlist)))
  1187.       {
  1188.         /* n_type is a char, and N_SOL, N_EINCL and N_BINCL are > 0x80, so
  1189.          * may look negative...therefore, must mask to low bits
  1190.          */
  1191. !       switch (next->sym->n_type & 0xff) 
  1192.       {
  1193.       case N_SLINE:
  1194.         if (use_data_symbols) continue;
  1195. !       next->line = next->sym->n_desc;
  1196.         return 1;
  1197.       case N_DSLINE:
  1198.         if (!use_data_symbols) continue;
  1199. !       next->line = next->sym->n_desc;
  1200.         return 1;
  1201.   #ifdef HAVE_SUN_STABS
  1202.       case N_EINCL:
  1203. --- 3116,3142 ----
  1204.       *next = state_pointer + 1,
  1205.       /* Used to store source file */
  1206.       *source = state_pointer + 2;
  1207. !   struct file_entry *entry = (struct file_entry *) source->Sym;
  1208.   
  1209. !   current->Sym = next->Sym;
  1210.     current->line = next->line;
  1211.     current->filename = next->filename;
  1212.   
  1213. !   while (++(next->Sym) < (entry->symbols
  1214.                 + entry->header.a_syms/sizeof (struct nlist)))
  1215.       {
  1216.         /* n_type is a char, and N_SOL, N_EINCL and N_BINCL are > 0x80, so
  1217.          * may look negative...therefore, must mask to low bits
  1218.          */
  1219. !       switch (next->Sym->n_type & 0xff) 
  1220.       {
  1221.       case N_SLINE:
  1222.         if (use_data_symbols) continue;
  1223. !       next->line = next->Sym->n_desc;
  1224.         return 1;
  1225.       case N_DSLINE:
  1226.         if (!use_data_symbols) continue;
  1227. !       next->line = next->Sym->n_desc;
  1228.         return 1;
  1229.   #ifdef HAVE_SUN_STABS
  1230.       case N_EINCL:
  1231. ***************
  1232. *** 2852,2870 ****
  1233.         continue;
  1234.   #endif
  1235.       case N_SO:
  1236. !       source->filename = next->sym->n_un.n_strx + entry->strings;
  1237.         source->line++;
  1238.   #ifdef HAVE_SUN_STABS
  1239.       case N_BINCL:
  1240.   #endif
  1241.       case N_SOL:
  1242. !       next->filename
  1243. !         = next->sym->n_un.n_strx + entry->strings;
  1244.       default:
  1245.         continue;
  1246.       }
  1247.       }
  1248. !   next->sym = (struct nlist *) 0;
  1249.     return 0;
  1250.   }
  1251.   
  1252. --- 3144,3162 ----
  1253.         continue;
  1254.   #endif
  1255.       case N_SO:
  1256. !       source->filename = next->Sym->n_un.n_strx + entry->strings;
  1257.         source->line++;
  1258.   #ifdef HAVE_SUN_STABS
  1259.       case N_BINCL:
  1260.   #endif
  1261.       case N_SOL:
  1262. !       next->filename =
  1263. !         next->Sym->n_un.n_strx + entry->strings;
  1264.       default:
  1265.         continue;
  1266.       }
  1267.       }
  1268. !   next->Sym = (struct nlist *) 0;
  1269.     return 0;
  1270.   }
  1271.   
  1272. ***************
  1273. *** 2879,2887 ****
  1274.        struct file_entry *entry;
  1275.   {
  1276.     struct line_debug_entry
  1277. !     *state_pointer
  1278. !       = (struct line_debug_entry *)
  1279. !     xmalloc (3 * sizeof (struct line_debug_entry));
  1280.     register struct line_debug_entry
  1281.       *current = state_pointer,
  1282.       *next = state_pointer + 1,
  1283. --- 3171,3179 ----
  1284.        struct file_entry *entry;
  1285.   {
  1286.     struct line_debug_entry
  1287. !     *state_pointer =
  1288. !         (struct line_debug_entry *)
  1289. !         xmalloc (3 * sizeof (struct line_debug_entry));
  1290.     register struct line_debug_entry
  1291.       *current = state_pointer,
  1292.       *next = state_pointer + 1,
  1293. ***************
  1294. *** 2902,2908 ****
  1295.         /* I believe this translates to "We lose" */
  1296.         current->filename = next->filename = entry->filename;
  1297.         current->line = next->line = -1;
  1298. !       current->sym = next->sym = (struct nlist *) 0;
  1299.         return state_pointer;
  1300.       }
  1301.   
  1302. --- 3194,3200 ----
  1303.         /* I believe this translates to "We lose" */
  1304.         current->filename = next->filename = entry->filename;
  1305.         current->line = next->line = -1;
  1306. !       current->Sym = next->Sym = (struct nlist *) 0;
  1307.         return state_pointer;
  1308.       }
  1309.   
  1310. ***************
  1311. *** 2909,2920 ****
  1312.     next->line = source->line = 0;
  1313.     next->filename = source->filename
  1314.       = (tmp->n_un.n_strx + entry->strings);
  1315. !   source->sym = (struct nlist *) entry;
  1316. !   next->sym = tmp;
  1317.   
  1318.     next_debug_entry (use_data_symbols, state_pointer); /* To setup next */
  1319.   
  1320. !   if (!next->sym)        /* No line numbers for this section; */
  1321.                   /* setup output results as appropriate */
  1322.       {
  1323.         if (source->line)
  1324. --- 3201,3212 ----
  1325.     next->line = source->line = 0;
  1326.     next->filename = source->filename
  1327.       = (tmp->n_un.n_strx + entry->strings);
  1328. !   source->Sym = (struct nlist *) entry;
  1329. !   next->Sym = tmp;
  1330.   
  1331.     next_debug_entry (use_data_symbols, state_pointer); /* To setup next */
  1332.   
  1333. !   if (!next->Sym)        /* No line numbers for this section; */
  1334.                   /* setup output results as appropriate */
  1335.       {
  1336.         if (source->line)
  1337. ***************
  1338. *** 2954,2970 ****
  1339.   
  1340.     int use_data_symbols;
  1341.   
  1342. !   if (next->sym)
  1343. !     use_data_symbols = (next->sym->n_type & N_TYPE) == N_DATA;
  1344.     else
  1345.       return current->line;
  1346.   
  1347.     /* Go back to the beginning if we've already passed it.  */
  1348. !   if (current->sym->n_value > address)
  1349.       {
  1350.         tmp_pointer = init_debug_scan (use_data_symbols,
  1351.                        (struct file_entry *)
  1352. !                      ((state_pointer + 2)->sym));
  1353.         state_pointer[0] = tmp_pointer[0];
  1354.         state_pointer[1] = tmp_pointer[1];
  1355.         state_pointer[2] = tmp_pointer[2];
  1356. --- 3246,3262 ----
  1357.   
  1358.     int use_data_symbols;
  1359.   
  1360. !   if (next->Sym)
  1361. !     use_data_symbols = (next->Sym->n_type & N_TYPE) == N_DATA;
  1362.     else
  1363.       return current->line;
  1364.   
  1365.     /* Go back to the beginning if we've already passed it.  */
  1366. !   if (current->Sym->n_value > address)
  1367.       {
  1368.         tmp_pointer = init_debug_scan (use_data_symbols,
  1369.                        (struct file_entry *)
  1370. !                      ((state_pointer + 2)->Sym));
  1371.         state_pointer[0] = tmp_pointer[0];
  1372.         state_pointer[1] = tmp_pointer[1];
  1373.         state_pointer[2] = tmp_pointer[2];
  1374. ***************
  1375. *** 2972,2982 ****
  1376.       }
  1377.   
  1378.     /* If we're still in a bad way, return -1, meaning invalid line.  */
  1379. !   if (current->sym->n_value > address)
  1380.       return -1;
  1381.   
  1382. !   while (next->sym
  1383. !      && next->sym->n_value <= address
  1384.        && next_debug_entry (use_data_symbols, state_pointer))
  1385.       ;
  1386.     return current->line;
  1387. --- 3264,3274 ----
  1388.       }
  1389.   
  1390.     /* If we're still in a bad way, return -1, meaning invalid line.  */
  1391. !   if (current->Sym->n_value > address)
  1392.       return -1;
  1393.   
  1394. !   while (next->Sym
  1395. !      && next->Sym->n_value <= address
  1396.        && next_debug_entry (use_data_symbols, state_pointer))
  1397.       ;
  1398.     return current->line;
  1399. ***************
  1400. *** 3006,3023 ****
  1401.     struct relocation_info
  1402.       *reloc_start = data_segment ? entry->datarel : entry->textrel,
  1403.       *reloc;
  1404. !   int reloc_size
  1405. !     = ((data_segment ? entry->header.a_drsize : entry->header.a_trsize)
  1406. !        / sizeof (struct relocation_info));
  1407. !   int start_of_segment
  1408. !     = (data_segment ? entry->data_start_address : entry->text_start_address);
  1409.     struct nlist *start_of_syms = entry->symbols;
  1410. !   struct line_debug_entry *state_pointer
  1411. !     = init_debug_scan (data_segment != 0, entry);
  1412.     register struct line_debug_entry
  1413. !     *current = state_pointer,
  1414. !     *next = state_pointer + 1,
  1415. !     *source = state_pointer + 2;
  1416.     /* Assigned to generally static values; should not be written into.  */
  1417.     char *errfmt;
  1418.     /* Assigned to alloca'd values cand copied into; should be freed
  1419. --- 3298,3313 ----
  1420.     struct relocation_info
  1421.       *reloc_start = data_segment ? entry->datarel : entry->textrel,
  1422.       *reloc;
  1423. !   int reloc_size =
  1424. !     (data_segment ? entry->header.a_drsize : entry->header.a_trsize)
  1425. !        / sizeof (struct relocation_info);
  1426. !   int start_of_segment =
  1427. !     (data_segment ? entry->data_start_address : entry->text_start_address);
  1428.     struct nlist *start_of_syms = entry->symbols;
  1429. !   struct line_debug_entry *state_pointer =
  1430. !     init_debug_scan (data_segment != 0, entry);
  1431.     register struct line_debug_entry
  1432. !     *current = state_pointer;
  1433.     /* Assigned to generally static values; should not be written into.  */
  1434.     char *errfmt;
  1435.     /* Assigned to alloca'd values cand copied into; should be freed
  1436. ***************
  1437. *** 3095,3102 ****
  1438.         /* If errfmt == 0, errmsg has already been defined.  */
  1439.         if (errfmt != 0)
  1440.       {
  1441. !       errmsg = (char *) xmalloc (strlen (errfmt) + strlen (g->name) + 1);
  1442. !       sprintf (errmsg, errfmt, g->name, data_segment ? "data" : "text");
  1443.       }
  1444.   
  1445.         address_to_line (RELOC_ADDRESS (reloc) + start_of_segment,
  1446. --- 3385,3398 ----
  1447.         /* If errfmt == 0, errmsg has already been defined.  */
  1448.         if (errfmt != 0)
  1449.       {
  1450. !       char *nm;
  1451. !       if (demangler == NULL || (nm = (*demangler)(g->name)) == NULL)
  1452. !         nm = g->name;
  1453. !       errmsg = (char *) xmalloc (strlen (errfmt) + strlen (nm) + 1);
  1454. !       sprintf (errmsg, errfmt, nm, data_segment ? "data" : "text");
  1455. !       if (nm != g->name)
  1456. !         free (nm);
  1457.       }
  1458.   
  1459.         address_to_line (RELOC_ADDRESS (reloc) + start_of_segment,
  1460. ***************
  1461. *** 3125,3132 ****
  1462.        FILE *outfile;
  1463.   {
  1464.     int number_of_syms = entry->header.a_syms / sizeof (struct nlist);
  1465. !   unsigned char *nlist_bitvector
  1466. !     = (unsigned char *) alloca ((number_of_syms >> 3) + 1);
  1467.     struct line_debug_entry *text_scan, *data_scan;
  1468.     int i;
  1469.     char *errfmt, *file_name;
  1470. --- 3421,3428 ----
  1471.        FILE *outfile;
  1472.   {
  1473.     int number_of_syms = entry->header.a_syms / sizeof (struct nlist);
  1474. !   unsigned char *nlist_bitvector =
  1475. !     (unsigned char *) alloca ((number_of_syms >> 3) + 1);
  1476.     struct line_debug_entry *text_scan, *data_scan;
  1477.     int i;
  1478.     char *errfmt, *file_name;
  1479. ***************
  1480. *** 3204,3210 ****
  1481.       {
  1482.         if (g->undef_refs >= MAX_UREFS_PRINTED)
  1483.           continue;
  1484. !       
  1485.         if (++(g->undef_refs) == MAX_UREFS_PRINTED)
  1486.           errfmt = "More undefined \"%s\" refs follow";
  1487.         else
  1488. --- 3500,3506 ----
  1489.       {
  1490.         if (g->undef_refs >= MAX_UREFS_PRINTED)
  1491.           continue;
  1492.         if (++(g->undef_refs) == MAX_UREFS_PRINTED)
  1493.           errfmt = "More undefined \"%s\" refs follow";
  1494.         else
  1495. ***************
  1496. *** 3227,3233 ****
  1497.       }
  1498.         else
  1499.       continue;
  1500. !       
  1501.         if (line_number == -1)
  1502.       fprintf (outfile, "%s: ", entry->filename);
  1503.         else
  1504. --- 3523,3529 ----
  1505.       }
  1506.         else
  1507.       continue;
  1508.         if (line_number == -1)
  1509.       fprintf (outfile, "%s: ", entry->filename);
  1510.         else
  1511. ***************
  1512. *** 3234,3242 ****
  1513.       fprintf (outfile, "%s:%d: ", file_name, line_number);
  1514.   
  1515.         if (dont_allow_symbol_name)
  1516. !     fprintf (outfile, "%s", errfmt);
  1517.         else
  1518. !     fprintf (outfile, errfmt, g->name);
  1519.   
  1520.         fputc ('\n', outfile);
  1521.       }
  1522. --- 3530,3546 ----
  1523.       fprintf (outfile, "%s:%d: ", file_name, line_number);
  1524.   
  1525.         if (dont_allow_symbol_name)
  1526. !       fprintf (outfile, "%s", errfmt);
  1527.         else
  1528. !       {
  1529. !     char *nm;
  1530. !     if (demangler != NULL && (nm = (*demangler)(g->name)) != NULL)
  1531. !       {
  1532. !         fprintf (outfile, errfmt, nm);
  1533. !         free (nm);
  1534. !       } else
  1535. !         fprintf (outfile, errfmt, g->name);
  1536. !       }
  1537.   
  1538.         fputc ('\n', outfile);
  1539.       }
  1540. ***************
  1541. *** 3261,3267 ****
  1542.       return;
  1543.   
  1544.     each_file (do_file_warnings, outfile);
  1545.     if (list_unresolved_refs || list_multiple_defs)
  1546.       make_executable = 0;
  1547.   }
  1548. --- 3565,3573 ----
  1549.       return;
  1550.   
  1551.     each_file (do_file_warnings, outfile);
  1552. !   if (trace_files)
  1553. !       printf("undefined_global_sym_count= %d, multiple_def_count= %d\n",
  1554. !          undefined_global_sym_count, multiple_def_count);
  1555.     if (list_unresolved_refs || list_multiple_defs)
  1556.       make_executable = 0;
  1557.   }
  1558. ***************
  1559. *** 3314,3321 ****
  1560.   {
  1561.     N_SET_MAGIC (outheader, magic);
  1562.     outheader.a_text = text_size;
  1563. ! #ifdef sequent
  1564.     outheader.a_text += N_ADDRADJ (outheader);
  1565.   #endif
  1566.     outheader.a_data = data_size;
  1567.     outheader.a_bss = bss_size;
  1568. --- 3620,3631 ----
  1569.   {
  1570.     N_SET_MAGIC (outheader, magic);
  1571.     outheader.a_text = text_size;
  1572. !   if (T_flag_specified)
  1573. !       outheader.a_text += text_start;
  1574. ! #if TARGET_MACHINE==TARGET_SEQUENT
  1575.     outheader.a_text += N_ADDRADJ (outheader);
  1576. +   if (entry_symbol == 0)
  1577. +       entry_symbol = getsym("start");
  1578.   #endif
  1579.     outheader.a_data = data_size;
  1580.     outheader.a_bss = bss_size;
  1581. ***************
  1582. *** 3383,3389 ****
  1583. --- 3693,3717 ----
  1584.         coffheader.data_start = dp->s_vaddr;
  1585.       }
  1586.   #endif
  1587. + #if TARGET==TARGET_SEQUENT
  1588. +     if (SMAGIC == magic) {
  1589. +     char *target_ptr; 
  1590. +     long n; 
  1591.   
  1592. +     outheader.a_gdtbl = gdt_filler; 
  1593. +     if (sizeof(instr) > sizeof(outheader.a_bootstrap)) {
  1594. +         fatal("a_bootstrap too small for code"); 
  1595. +     } 
  1596. +     n = outheader.a_entry; 
  1597. +     target_ptr = &instr[sizeof(instr) - 4];
  1598. +     target_ptr[0] = n & 0xff; 
  1599. +     target_ptr[1] = (n >> 8) & 0xff; 
  1600. +     target_ptr[2] = (n >> 16) & 0xff; 
  1601. +     target_ptr[3] = (n >> 24) & 0xff; 
  1602. +     bcopy(instr, (char *)outheader.a_bootstrap, sizeof(instr)); 
  1603. +     }
  1604. + #endif
  1605.   #ifdef INITIALIZE_HEADER
  1606.     INITIALIZE_HEADER;
  1607.   #endif
  1608. ***************
  1609. *** 3423,3429 ****
  1610. --- 3751,3763 ----
  1611.     if (need_coff_header)
  1612.       mywrite (&coffheader, sizeof coffheader, 1, outdesc);
  1613.   #endif
  1614. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  1615. +   fix_exec_header_byte_order(&outheader);
  1616. + #endif
  1617.     mywrite (&outheader, sizeof (struct exec), 1, outdesc);
  1618. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  1619. +   fix_exec_header_byte_order(&outheader);
  1620. + #endif
  1621.   
  1622.     /* Output whatever padding is required in the executable file
  1623.        between the header and the start of the text.  */
  1624. ***************
  1625. *** 3431,3436 ****
  1626. --- 3765,3775 ----
  1627.   #ifndef COFF_ENCAPSULATE
  1628.     padfile (N_TXTOFF (outheader) - sizeof outheader, outdesc);
  1629.   #endif
  1630. +   if (T_flag_specified)
  1631. +       padfile (text_start - sizeof(struct exec), outdesc);
  1632.   }
  1633.   
  1634.   /* Relocate the text segment of each input file
  1635. ***************
  1636. *** 3489,3494 ****
  1637. --- 3828,3837 ----
  1638.         fprintf (stderr, "Return from read: %d\n", read_return);
  1639.         fatal_with_file ("premature eof in text relocation of ", entry);
  1640.       }
  1641. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  1642. +       target_to_host_reloc_byte_order(reloc,
  1643. +     entry->header.a_trsize/sizeof(*reloc));
  1644. + #endif
  1645.         entry->textrel = reloc;
  1646.       }
  1647.   
  1648. ***************
  1649. *** 3502,3507 ****
  1650. --- 3845,3854 ----
  1651.            L_SET);
  1652.         if (entry->header.a_drsize != read (desc, reloc, entry->header.a_drsize))
  1653.       fatal_with_file ("premature eof in data relocation of ", entry);
  1654. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  1655. +       target_to_host_reloc_byte_order(reloc,
  1656. +     entry->header.a_drsize/sizeof(*reloc));
  1657. + #endif
  1658.         entry->datarel = reloc;
  1659.       }
  1660.   }
  1661. ***************
  1662. *** 3538,3546 ****
  1663. --- 3885,3902 ----
  1664.     else
  1665.       {
  1666.         reloc = (struct relocation_info *) alloca (entry->header.a_trsize);
  1667. +       if (trace_files)
  1668. +           printf("lseek to 0x%x (t_o= 0x%x, a_t= 0x%x, a_d= 0x%x)\n",
  1669. +              text_offset(entry) + entry->header.a_text +
  1670. +              entry->header.a_data, text_offset(entry),
  1671. +              entry->header.a_text, entry->header.a_data);
  1672.         lseek (desc, text_offset (entry) + entry->header.a_text + entry->header.a_data, 0);
  1673.         if (entry->header.a_trsize != read (desc, reloc, entry->header.a_trsize))
  1674.       fatal_with_file ("premature eof in text relocation of ", entry);
  1675. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  1676. +       target_to_host_reloc_byte_order(reloc,
  1677. +       entry->header.a_trsize/sizeof(*reloc));
  1678. + #endif
  1679.       }
  1680.   
  1681.     /* Read the text section into core.  */
  1682. ***************
  1683. *** 3575,3580 ****
  1684. --- 3931,3945 ----
  1685.     /* Write out the set element vectors.  See digest symbols for
  1686.        description of length of the set vector section.  */
  1687.   
  1688. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  1689. +   {
  1690. +     int i;
  1691. +     for (i = 0; i < 2 * set_symbol_count + set_vector_count; ++i) {
  1692. +     fix_byte_order(&set_vectors[i], sizeof(*set_vectors));
  1693. +     }
  1694. +   }
  1695. + #endif
  1696.     if (set_vector_count)
  1697.       mywrite (set_vectors, 2 * set_symbol_count + set_vector_count,
  1698.            sizeof (unsigned long), outdesc);
  1699. ***************
  1700. *** 3619,3624 ****
  1701. --- 3984,3993 ----
  1702.            0);
  1703.         if (entry->header.a_drsize != read (desc, reloc, entry->header.a_drsize))
  1704.       fatal_with_file ("premature eof in data relocation of ", entry);
  1705. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  1706. +       target_to_host_reloc_byte_order(reloc,
  1707. +       entry->header.a_drsize/sizeof(*reloc));
  1708. + #endif
  1709.       }
  1710.   
  1711.     lseek (desc, text_offset (entry) + entry->header.a_text, 0);
  1712. ***************
  1713. *** 3662,3667 ****
  1714. --- 4031,4037 ----
  1715.         register int relocation = 0;
  1716.         register int addr = RELOC_ADDRESS(p);
  1717.         register unsigned int mask = 0;
  1718. +       register unsigned int x;
  1719.   
  1720.         if (addr >= data_size)
  1721.       fatal_with_file ("relocation address out of range in ", entry);
  1722. ***************
  1723. *** 3719,3727 ****
  1724.       default:
  1725.         fatal_with_file ("nonexternal relocation code invalid in ", entry);
  1726.       }
  1727.         if (RELOC_PCREL_P(p))
  1728.       relocation -= pc_relocation;
  1729.   
  1730.   #ifdef RELOC_ADD_EXTRA
  1731.         relocation += RELOC_ADD_EXTRA(p);
  1732. --- 4089,4098 ----
  1733.       default:
  1734.         fatal_with_file ("nonexternal relocation code invalid in ", entry);
  1735.       }
  1736. ! #if 0
  1737.         if (RELOC_PCREL_P(p))
  1738.       relocation -= pc_relocation;
  1739. + #endif
  1740.   
  1741.   #ifdef RELOC_ADD_EXTRA
  1742.         relocation += RELOC_ADD_EXTRA(p);
  1743. ***************
  1744. *** 3737,3746 ****
  1745.             else
  1746.           RELOC_ADD_EXTRA (p) -= pc_relocation;
  1747.           }
  1748. ! #if 0
  1749.         if (! RELOC_PCREL_P (p))
  1750.           {
  1751. !           if ((int)p->r_type <= RELOC_32
  1752.             || RELOC_EXTERN_P (p) == 0)
  1753.           RELOC_ADD_EXTRA (p) = relocation;
  1754.           }
  1755. --- 4108,4117 ----
  1756.             else
  1757.           RELOC_ADD_EXTRA (p) -= pc_relocation;
  1758.           }
  1759. ! #if 1
  1760.         if (! RELOC_PCREL_P (p))
  1761.           {
  1762. !           if ((int)p->r_type <= (int) RELOC_32
  1763.             || RELOC_EXTERN_P (p) == 0)
  1764.           RELOC_ADD_EXTRA (p) = relocation;
  1765.           }
  1766. ***************
  1767. *** 3750,3755 ****
  1768. --- 4121,4130 ----
  1769.         continue;
  1770.       }
  1771.   #endif
  1772. + #if 1    
  1773. +        if (RELOC_PCREL_P(p))
  1774. +        relocation -= pc_relocation;
  1775. + #endif
  1776.   
  1777.         relocation >>= RELOC_VALUE_RIGHTSHIFT(p);
  1778.   
  1779. ***************
  1780. *** 3774,3794 ****
  1781.         break;
  1782.   
  1783.       case 1:
  1784.         if (RELOC_MEMORY_SUB_P(p))
  1785. !         relocation -= mask & *(short *) (data + addr);
  1786.         else if (RELOC_MEMORY_ADD_P(p))
  1787. !         relocation += mask & *(short *) (data + addr);
  1788. !       *(short *) (data + addr) &= ~mask;
  1789. !       *(short *) (data + addr) |= relocation;
  1790.         break;
  1791.   
  1792.       case 2:
  1793. !       if (RELOC_MEMORY_SUB_P(p))
  1794. !         relocation -= mask & *(long *) (data + addr);
  1795.         else if (RELOC_MEMORY_ADD_P(p))
  1796. !         relocation += mask & *(long *) (data + addr);
  1797. !       *(long *) (data + addr) &= ~mask;
  1798. !       *(long *) (data + addr) |= relocation;
  1799.         break;
  1800.   
  1801.       default:
  1802. --- 4149,4209 ----
  1803.         break;
  1804.   
  1805.       case 1:
  1806. + #if TARGET_BYTE_ORDER==BIG_ENDIAN
  1807. +       x = ((unsigned char *) (data + addr))[1]
  1808. +        | (((unsigned char *) (data + addr))[0] << 8);
  1809. + #endif
  1810. + #if TARGET_BYTE_ORDER==LITTLE_ENDIAN
  1811. +       x = ((unsigned char *) (data + addr))[0]
  1812. +        | (((unsigned char *) (data + addr))[1] << 8);
  1813. + #endif
  1814.         if (RELOC_MEMORY_SUB_P(p))
  1815. !         relocation -= mask & x;
  1816.         else if (RELOC_MEMORY_ADD_P(p))
  1817. !         relocation += mask & x;
  1818. !       x &= ~mask;
  1819. !       x |= relocation;
  1820. ! #if TARGET_BYTE_ORDER==BIG_ENDIAN
  1821. !       ((unsigned char *) (data + addr))[1] = x;
  1822. !       ((unsigned char *) (data + addr))[0] = x >> 8;
  1823. ! #endif
  1824. ! #if TARGET_BYTE_ORDER==LITTLE_ENDIAN
  1825. !       ((unsigned char *) (data + addr))[0] = x;
  1826. !       ((unsigned char *) (data + addr))[1] = x >> 8;
  1827. ! #endif
  1828.         break;
  1829.   
  1830.       case 2:
  1831. ! #if TARGET_BYTE_ORDER==BIG_ENDIAN
  1832. !       x = ((unsigned char *) (data + addr))[3]
  1833. !        | (((unsigned char *) (data + addr))[2] << 8)
  1834. !        | (((unsigned char *) (data + addr))[1] << 16)
  1835. !        | (((unsigned char *) (data + addr))[0] << 24);
  1836. ! #endif
  1837. ! #if TARGET_BYTE_ORDER==LITTLE_ENDIAN
  1838. !       x = ((unsigned char *) (data + addr))[0]
  1839. !        | (((unsigned char *) (data + addr))[1] << 8)
  1840. !        | (((unsigned char *) (data + addr))[2] << 16)
  1841. !        | (((unsigned char *) (data + addr))[3] << 24);
  1842. ! #endif
  1843. !           if (RELOC_MEMORY_SUB_P(p))
  1844. !         relocation -= mask & x;
  1845.         else if (RELOC_MEMORY_ADD_P(p))
  1846. !         relocation += mask & x;
  1847. !       x &= ~mask;
  1848. !       x |= relocation;
  1849. ! #if TARGET_BYTE_ORDER==BIG_ENDIAN
  1850. !       ((unsigned char *) (data + addr))[3] = x;
  1851. !       ((unsigned char *) (data + addr))[2] = x >> 8;
  1852. !       ((unsigned char *) (data + addr))[1] = x >> 16;
  1853. !       ((unsigned char *) (data + addr))[0] = x >> 24;
  1854. ! #endif
  1855. ! #if TARGET_BYTE_ORDER==LITTLE_ENDIAN
  1856. !       ((unsigned char *) (data + addr))[0] = x;
  1857. !       ((unsigned char *) (data + addr))[1] = x >> 8;
  1858. !       ((unsigned char *) (data + addr))[2] = x >> 16;
  1859. !       ((unsigned char *) (data + addr))[3] = x >> 24;
  1860. ! #endif
  1861.         break;
  1862.   
  1863.       default:
  1864. ***************
  1865. *** 3903,3908 ****
  1866. --- 4318,4327 ----
  1867.       }
  1868.         p++;
  1869.       }
  1870. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  1871. +     host_to_target_reloc_byte_order((struct relocation_info *) entry->textrel,
  1872. +     entry->header.a_trsize/sizeof(struct relocation_info));
  1873. + #endif
  1874.     mywrite (entry->textrel, 1, entry->header.a_trsize, outdesc);
  1875.   }
  1876.   
  1877. ***************
  1878. *** 3962,3967 ****
  1879. --- 4381,4390 ----
  1880.       }
  1881.         p++;
  1882.       }
  1883. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  1884. +     host_to_target_reloc_byte_order((struct relocation_info *) entry->datarel,
  1885. +     entry->header.a_drsize/sizeof(struct relocation_info));
  1886. + #endif
  1887.     mywrite (entry->datarel, 1, entry->header.a_drsize, outdesc);
  1888.   }
  1889.   
  1890. ***************
  1891. *** 4169,4174 ****
  1892. --- 4592,4609 ----
  1893.     /* Output the buffer full of `struct nlist's.  */
  1894.   
  1895.     lseek (outdesc, symbol_table_offset + symbol_table_len, 0);
  1896. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  1897. +   {
  1898. +     int i;
  1899. +     for (i = 0; i < bufp - buf; ++i)
  1900. +       {
  1901. +         fix_byte_order(&buf[i].n_un.n_name, sizeof(buf->n_un.n_name));
  1902. +     fix_byte_order(&buf[i].n_desc, sizeof(buf->n_desc));
  1903. +     fix_byte_order(&buf[i].n_value, sizeof(buf->n_value));
  1904. +       }
  1905. +   }
  1906. + #endif
  1907.     mywrite (buf, sizeof (struct nlist), bufp - buf, outdesc);
  1908.     symbol_table_len += sizeof (struct nlist) * (bufp - buf);
  1909.   
  1910. ***************
  1911. *** 4181,4186 ****
  1912. --- 4616,4625 ----
  1913.     /* Now the total string table size is known, so write it.
  1914.        We are already positioned at the right place in the file.  */
  1915.   
  1916. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  1917. +   fix_byte_order(&strtab_size, sizeof(strtab_size));
  1918. + #endif
  1919.     mywrite (&strtab_size, sizeof (int), 1, outdesc);  /* we're at right place */
  1920.   
  1921.     /* Write the strings for the global symbols.  */
  1922. ***************
  1923. *** 4224,4230 ****
  1924. --- 4663,4673 ----
  1925.       {
  1926.         struct nlist nl;
  1927.   
  1928. + #if TARGET==TARGET_SEQUENT      
  1929. +       nl.n_type = N_FN;
  1930. + #else      
  1931.         nl.n_type = N_TEXT;
  1932. + #endif
  1933.         nl.n_un.n_strx = assign_string_table_index (entry->local_sym_name);
  1934.         nl.n_value = entry->text_start_address;
  1935.         nl.n_desc = 0;
  1936. ***************
  1937. *** 4281,4286 ****
  1938. --- 4724,4741 ----
  1939.     /* All the symbols are now in BUF; write them.  */
  1940.   
  1941.     lseek (outdesc, symbol_table_offset + symbol_table_len, 0);
  1942. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  1943. +   {
  1944. +     int i;
  1945. +     for (i = 0; i < bufp - buf; ++i)
  1946. +       {
  1947. +     fix_byte_order(&buf[i].n_un.n_name, sizeof(buf->n_un.n_name));
  1948. +     fix_byte_order(&buf[i].n_desc, sizeof(buf->n_desc));
  1949. +     fix_byte_order(&buf[i].n_value, sizeof(buf->n_value));
  1950. +       }
  1951. +   }
  1952. + #endif
  1953.     mywrite (buf, sizeof (struct nlist), bufp - buf, outdesc);
  1954.     symbol_table_len += sizeof (struct nlist) * (bufp - buf);
  1955.   
  1956. ***************
  1957. *** 4322,4327 ****
  1958. --- 4777,4786 ----
  1959.     if (sizeof root != read (indesc, &root, sizeof root))
  1960.       fatal_with_file ("premature end of file in symbol segment of ", entry);
  1961.   
  1962. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  1963. +   fix_symbol_root_byte_order(&root);
  1964. + #endif
  1965.     /* Store some relocation info into the root.  */
  1966.   
  1967.     root.ldsymoff = entry->local_syms_offset;
  1968. ***************
  1969. *** 4334,4339 ****
  1970. --- 4793,4801 ----
  1971.   
  1972.     /* Write the modified root into the output file.  */
  1973.   
  1974. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  1975. +   fix_symbol_root_byte_order(&root);
  1976. + #endif
  1977.     mywrite (&root, sizeof root, 1, outdesc);
  1978.   
  1979.     /* Copy the rest of the symbol segment unchanged.  */
  1980. ***************
  1981. *** 4385,4391 ****
  1982.     end_symbol = getsym ("end");
  1983.   #endif
  1984.   
  1985. ! #ifdef sun
  1986.     {
  1987.       symbol *dynamic_symbol = getsym ("__DYNAMIC");
  1988.       dynamic_symbol->defined = N_ABS | N_EXT;
  1989. --- 4847,4853 ----
  1990.     end_symbol = getsym ("end");
  1991.   #endif
  1992.   
  1993. ! #if TARGET_MACHINE==TARGET_SUN4 || TARGET_MACHINE==TARGET_SUN3 || TARGET_MACHINE==TARGET_SUN2
  1994.     {
  1995.       symbol *dynamic_symbol = getsym ("__DYNAMIC");
  1996.       dynamic_symbol->defined = N_ABS | N_EXT;
  1997. ***************
  1998. *** 4393,4399 ****
  1999.       dynamic_symbol->value = 0;
  2000.     }
  2001.   #endif
  2002. ! #ifdef sequent
  2003.     {
  2004.       symbol *_387_flt_symbol = getsym ("_387_flt");
  2005.       _387_flt_symbol->defined = N_ABS | N_EXT;
  2006. --- 4855,4861 ----
  2007.       dynamic_symbol->value = 0;
  2008.     }
  2009.   #endif
  2010. ! #if TARGET_MACHINE==TARGET_SEQUENT
  2011.     {
  2012.       symbol *_387_flt_symbol = getsym ("_387_flt");
  2013.       _387_flt_symbol->defined = N_ABS | N_EXT;
  2014. ***************
  2015. *** 4691,4693 ****
  2016. --- 5153,5323 ----
  2017.   }
  2018.   
  2019.   #endif
  2020. + #if HOST_BYTE_ORDER != TARGET_BYTE_ORDER
  2021. + static void
  2022. + fix_byte_order(p, n)
  2023. +     char *p;
  2024. +     int n;
  2025. + {
  2026. +     char t;
  2027. +     switch (n) {
  2028. +     case 1:
  2029. +     return;
  2030. +     case 2:
  2031. +     t = p[0];
  2032. +     p[0] = p[1];
  2033. +     p[1] = t;
  2034. +     return;
  2035. +     case 4:
  2036. +     t = p[0];
  2037. +     p[0] = p[3];
  2038. +     p[3] = t;
  2039. +     t = p[1];
  2040. +     p[1] = p[2];
  2041. +     p[2] = t;
  2042. +     return;
  2043. +     default:
  2044. +     fatal("Internal Error in fix_byte_order, n = %d\n", 0);
  2045. +     }
  2046. + }
  2047. + static void
  2048. + fix_exec_header_byte_order(execP)
  2049. +     struct exec *execP;
  2050. + {
  2051. + #if TARGET_MACHINE==TARGET_SUN4
  2052. +     if (N_BADMAG(*execP)) {
  2053. +     u_char c = * (u_char *) execP;
  2054. +     execP->a_dynamic = c & 1;
  2055. +     execP->a_toolversion = c >> 1;
  2056. +     } else {
  2057. +     u_char c = execP->a_toolversion | (execP->a_dynamic << 7);
  2058. +     * (u_char *) execP = c;
  2059. +     }
  2060. + #elif TARGET_MACHINE!=TARGET_SEQUENT
  2061. +     fix_byte_order(&execP->a_machtype, sizeof(execP->a_machtype));
  2062. + #endif
  2063. +     fix_byte_order(&execP->a_magic,    sizeof(execP->a_magic));
  2064. +     fix_byte_order(&execP->a_text,     sizeof(execP->a_text));
  2065. +     fix_byte_order(&execP->a_data,     sizeof(execP->a_data));
  2066. +     fix_byte_order(&execP->a_bss,      sizeof(execP->a_bss));
  2067. +     fix_byte_order(&execP->a_syms,     sizeof(execP->a_syms));
  2068. +     fix_byte_order(&execP->a_entry,    sizeof(execP->a_entry));
  2069. +     fix_byte_order(&execP->a_trsize,   sizeof(execP->a_trsize));
  2070. +     fix_byte_order(&execP->a_drsize,   sizeof(execP->a_drsize));
  2071. +     return;
  2072. + }
  2073. + static void
  2074. + fix_symbol_byte_order(p, size)
  2075. +     struct nlist *p;
  2076. +     int size;
  2077. + {
  2078. +     int n;
  2079. +     for (n = size / sizeof(*p); --n >= 0; ++p) {
  2080. +     fix_byte_order(&p->n_un, sizeof(p->n_un));
  2081. +     fix_byte_order(&p->n_desc, sizeof(p->n_desc));
  2082. +     fix_byte_order(&p->n_value, sizeof(p->n_value));
  2083. +     }
  2084. +     return;
  2085. + }
  2086. + static void
  2087. + target_to_host_reloc_byte_order(relocP, nrelocs)
  2088. +     struct relocation_info *relocP;
  2089. +     int nrelocs;
  2090. + {
  2091. +     u_char c[4];
  2092. + #if TARGET_BYTE_ORDER==BIG_ENDIAN && HOST_BYTE_ORDER==LITTLE_ENDIAN
  2093. +     for (; --nrelocs >= 0; ++relocP) {
  2094. +     fix_byte_order(&relocP->r_address, sizeof(relocP->r_address));
  2095. +     c[0] = ((u_char *) relocP)[4];
  2096. +     c[1] = ((u_char *) relocP)[5];
  2097. +     c[2] = ((u_char *) relocP)[6];
  2098. +     c[3] = ((u_char *) relocP)[7];
  2099. +     ((u_long *) relocP)[1] = 0;
  2100. + #if TARGET_MACHINE==TARGET_SUN4
  2101. +     relocP->r_index = (c[0] << 16) | (c[1] << 8) | c[2];
  2102. +     relocP->r_type = (enum reloc_type) (c[3] & 0x1f);
  2103. +     relocP->r_extern = (c[3] & 0x80) >> 7;
  2104. +     fix_byte_order(&relocP->r_addend, sizeof(relocP->r_addend));
  2105. + #else
  2106. +     relocP->r_symbolnum = (c[0] << 16) | (c[1] << 8) | c[2];
  2107. +     relocP->r_pcrel = (c[3] >> 7) & 1;
  2108. +     relocP->r_length = (c[3] >> 5) & 3;
  2109. +     relocP->r_extern = (c[3] >> 4) & 1;
  2110. + #endif
  2111. +     }
  2112. + #endif
  2113. +     return;
  2114. + }
  2115. + static void
  2116. + host_to_target_reloc_byte_order(relocP, nrelocs)
  2117. +     struct relocation_info *relocP;
  2118. +     int nrelocs;
  2119. + {
  2120. +     u_char c[4];
  2121. + #if TARGET_BYTE_ORDER==BIG_ENDIAN && HOST_BYTE_ORDER==LITTLE_ENDIAN
  2122. +     for (; --nrelocs >= 0; ++relocP) {
  2123. +     fix_byte_order(&relocP->r_address, sizeof(relocP->r_address));
  2124. + #if TARGET_MACHINE==TARGET_SUN4
  2125. +     c[0] = (relocP->r_index >> 16);
  2126. +     c[1] = (relocP->r_index >> 8);
  2127. +     c[2] = relocP->r_index;
  2128. +     c[3] = (u_char) relocP->r_type | (relocP->r_extern << 7);
  2129. +     fix_byte_order(&relocP->r_addend, sizeof(relocP->r_addend));
  2130. + #else
  2131. +     c[0] = (relocP->r_symbolnum >> 16);
  2132. +     c[1] = (relocP->r_symbolnum >> 8);
  2133. +     c[2] = relocP->r_symbolnum;
  2134. +     c[3] = (relocP->r_pcrel << 7) |
  2135. +         (relocP->r_length << 5) | (relocP->r_extern << 4);
  2136. + #endif
  2137. +     ((u_char *) relocP)[4] = c[0];
  2138. +     ((u_char *) relocP)[5] = c[1];
  2139. +     ((u_char *) relocP)[6] = c[2];
  2140. +     ((u_char *) relocP)[7] = c[3];
  2141. +     }
  2142. + #endif
  2143. +     return;
  2144. + }
  2145. + static void
  2146. + fix_symbol_root_byte_order(p)
  2147. +     struct symbol_root *p;
  2148. + {
  2149. +     fix_byte_order(&p->format, sizeof(p->format));
  2150. +     fix_byte_order(&p->length, sizeof(p->length));
  2151. +     fix_byte_order(&p->ldsymoff, sizeof(p->ldsymoff));
  2152. +     fix_byte_order(&p->textrel, sizeof(p->textrel));
  2153. +     fix_byte_order(&p->datarel, sizeof(p->datarel));
  2154. +     fix_byte_order(&p->bssrel, sizeof(p->bssrel));
  2155. +     fix_byte_order(&p->filename, sizeof(p->filename));
  2156. +     fix_byte_order(&p->filedir, sizeof(p->filedir));
  2157. +     fix_byte_order(&p->blockvector, sizeof(p->blockvector));
  2158. +     fix_byte_order(&p->typevector, sizeof(p->typevector));
  2159. +     fix_byte_order(&p->language, sizeof(p->language));
  2160. +     fix_byte_order(&p->version, sizeof(p->version));
  2161. +     fix_byte_order(&p->compilation, sizeof(p->compilation));
  2162. +     fix_byte_order(&p->databeg, sizeof(p->databeg));
  2163. +     fix_byte_order(&p->bssbeg, sizeof(p->bssbeg));
  2164. +     fix_byte_order(&p->sourcevector, sizeof(p->sourcevector));
  2165. +     return;
  2166. + }
  2167. + #endif
  2168.